package demo;

/**
 * 演示接口作为方法参数的单一Java类实现
 */
public class InterfaceAsParameterDemo {

    /**
     * 字段校验接口（作为内部接口）
     */
    @FunctionalInterface
    interface FieldCheck {
        /**
         * 校验字段
         * @return true:字段无效。false:字段有效
         */
        boolean isInvalid();
    }

    /**
     * 用户服务类（作为内部类）
     */
    static class UserService {
        
        /**
         * 验证用户信息
         * @param username 用户名
         * @param password 密码
         * @param checkStrategy 校验策略接口
         * @return 验证结果
         */
        public boolean validateUser(String username, String password, FieldCheck checkStrategy) {
            return checkStrategy.isInvalid();
        }
    }

    /**
     * 预定义的字段长度校验实现（作为内部类）
     */
    static class LengthFieldCheck implements FieldCheck {
        private final int minLength;
        private final int maxLength;
        private String value;
        
        public LengthFieldCheck(int minLength, int maxLength) {
            this.minLength = minLength;
            this.maxLength = maxLength;
        }
        
        public void setValue(String value) {
            this.value = value;
        }
        
        @Override
        public boolean isInvalid() {
            if (value == null) {
                return true;
            }
            int length = value.length();
            return length < minLength || length > maxLength;
        }
    }

    public static void main(String[] args) {
        UserService userService = new UserService();
        
        // 1. 使用Lambda表达式实现接口
        boolean result1 = userService.validateUser("admin", "123456", 
            () -> "admin".isEmpty() || "123456".isEmpty());
        System.out.println("Lambda验证结果: " + result1);
        
        // 2. 使用方法引用
//        boolean result2 = userService.validateUser("", "123456",
//            String::isEmpty);
//        System.out.println("方法引用验证结果: " + result2);
        
        // 3. 使用匿名内部类
        boolean result3 = userService.validateUser("admin", "", 
            new FieldCheck() {
                @Override
                public boolean isInvalid() {
                    return "admin".length() < 5 || "".length() < 6;
                }
            });
        System.out.println("匿名内部类验证结果: " + result3);
        
        // 4. 使用预定义的实现类
        LengthFieldCheck lengthCheck = new LengthFieldCheck(5, 8);
        lengthCheck.setValue("password");
        boolean result4 = userService.validateUser("admin", "password", lengthCheck);
        System.out.println("预定义实现类验证结果: " + result4);
        
        // 5. 使用Lambda表达式检查密码长度
        boolean result5 = userService.validateUser("user", "short", 
            () -> "short".length() < 6);
        System.out.println("密码长度检查结果: " + result5);
    }
}